/**
 * N个点的有向图，给定数组F和G
 * 如果 i < j 且 Fi < Fj 且 Gi < Gj，则 i到j 有一条边
 * 否则j到i有一条边
 * 求三元环的数量
 * 
 * 任意两点有且只有一条边，所以，任意三点必然有三边。
 * 所以如果不是三元环的话，必然有且只有一个点其入度是2
 * 反过来，有一个点的入度是2，表明对应的三点不是三元环
 * 
 * 因此计算公式为 C(N, 3) - SIGMA{C(Di, 2)}
 * 其中Di是i的入度
 * 
 * 求两次三维偏序即可
 * 第一次对i点求出所有三维都比它小的数量，这些都是入度
 * 第二次对i点求出三维都比它大的数量，再用 N 减去编号减去数量，这些也是入度
 * 
 * CDQ套树状数组，实现方便。CDQ套CDQ超时了。
 */
#include <bits/stdc++.h>
using namespace std;
#include <bits/extc++.h>
using namespace __gnu_pbds;

using llt = long long;
using vi = vector<int>;
using vll = vector<llt>;

struct FenwickTree{ // 树状数组

using value_type = int;
using vec_type = vector<value_type>;

int n;
vec_type c;

FenwickTree() = default;

static int lowbit(int x){return x & -x;}

void init(int nn){this->c.assign((this->n=nn) + 1, 0);}

void modify(int pos, value_type delta){
    for(int i=pos;i<=this->n;i+=lowbit(i)) this->c[i] += delta;
}

value_type query(int pos)const{
    value_type ans = 0;
    for(int i=pos;i;i-=lowbit(i)) ans += this->c[i];
    return ans;
}

value_type query(int s, int e)const{return this->query(e) - this->query(s - 1);}

};

FenwickTree Bt;

struct _t{
    int x;
    int y;
    int z;
};

int N;
vector<_t> A, B;
vector<int> Dless, Dgreate;
int Limit;

void CDQless(int s, int e){
    if(s >= e) return;

    int mid = (s + e) >> 1;
    CDQless(s, mid); CDQless(mid + 1, e);

    int u = s, v = mid + 1, t = s;
    while(u <= mid and v <= e){
        if(A[u].y < A[v].y){
            auto p = A[u].z;
            Bt.modify(p, 1);
            B[t++] = A[u++];
        }else{
            auto p = A[v].z;
            Dless[A[v].x] += Bt.query(p - 1);
            B[t++] = A[v++];
        }
    }
    while(u <= mid){
        auto p = A[u].z;
        Bt.modify(p, 1);
        B[t++] = A[u++];        
    }
    while(v <= e){
        auto p = A[v].z;
        Dless[A[v].x] += Bt.query(p - 1);
        B[t++] = A[v++];        
    }
    for(int i=s;i<=mid;++i){
        Bt.modify(A[i].z, -1);
    }
    copy(B.begin()+s, B.begin()+e+1, A.begin() + s);
    return;
}

void CDQgreate(int s, int e){
    if(s >= e) return;

    int mid = (s + e) >> 1;
    CDQgreate(s, mid); CDQgreate(mid + 1, e);

    int u = s, v = mid + 1, t = s;
    while(u <= mid and v <= e){
        if(A[u].y > A[v].y){
            auto p = A[u].z;
            Bt.modify(p, 1);
            B[t++] = A[u++];
        }else{
            auto p = A[v].z;
            Dgreate[A[v].x] += Bt.query(p + 1, Limit);
            B[t++] = A[v++];
        }
    }
    while(u <= mid){
        auto p = A[u].z;
        Bt.modify(p, 1);
        B[t++] = A[u++];        
    }
    while(v <= e){
        auto p = A[v].z;
        Dgreate[A[v].x] += Bt.query(p + 1, Limit);
        B[t++] = A[v++];        
    }
    for(int i=s;i<=mid;++i){
        Bt.modify(A[i].z, -1);
    }
    copy(B.begin()+s, B.begin()+e+1, A.begin() + s);
    return;
}

void work(){
    cin >> N;
    A.assign(N + 1, {});
    for(int i=1;i<=N;++i){
        A[i].x = i;
        cin >> A[i].y;
    }
    Limit = 0;
    for(int i=1;i<=N;++i){
        A[i].x = i;
        cin >> A[i].z;
        Limit = max(Limit, A[i].z);
    }
    B.assign(N + 1, {});

    Dless.assign(N + 1, 0);
    Bt.init(Limit);
    sort(A.begin() + 1, A.end(), [](const _t & a, const _t & b){
        return a.x < b.x;
    });
    CDQless(1, N);
    
    Dgreate.assign(N + 1, 0);
    sort(A.begin() + 1, A.end(), [](const _t & a, const _t & b){
        return a.x > b.x;
    });
    CDQgreate(1, N);

    llt ans = N * (N - 1LL) * (N - 2LL) / 6;
    for(int i=1;i<=N;++i){
        llt t = Dless[i] + N - i - Dgreate[i];
        ans -= t * (t - 1LL) / 2; 
    }
    cout << ans << endl;
	return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);	
    int nofkase = 1;
	// cin >> nofkase;
	while(nofkase--) work();
	return 0;
}